//
//  ViewController.swift
//  闭包的循环引用
//
//  Created by Summer on 2017/11/14.
//  Copyright © 2017年 Summer. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    // 属性都是强引用，self强引用finishedCallBack这个闭包
    var finishedCallBack: ((_ msg:String)->())?
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        
        // 造成循环引用
        // loadData这个闭包引用self.view，
        loadData { (msg) in
            // 闭包是准备好的代码，必须使用self.
            print(msg + "\(self.view)")
        }
        
        
    }

    // 闭包的使用
    // 1.参数传递
    // 2.使用属性记录，在需要的时候执行
    func loadData(finished: @escaping (_ msg:String)->()) {

        DispatchQueue.global().async {
            // code
            print("耗时操作")
            DispatchQueue.main.async {
                // 主线程中
//                finished("Hello")
                
                // 使用属性记录
                self.finishedCallBack = finished
                self.working()
            }
        }
    }
    
    func working() {
        // 执行闭包
        // !表示闭包一定存在，就执行，不存在则崩溃
//        finishedCallBack!("hello")
        // ?表示闭包若不存在，则返回，不执行
        finishedCallBack?("hello")
    }

    deinit {
        print("释放了")
    }

}

